#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#include "parser.h"
#include "dir_explorer.h"
#include "utilidades.h"
#include "vector_dinamico.h"
#include "merge.h"
#include "matriz_svdlibc.h"

/*
 * Escribe la ruta recibida en el archivo de rutas tambien recibido.
 */
void ruta_a_archivo(FILE* ruta_archivos,char* ruta){
	
	if( !ruta_archivos ) return;
	
	fprintf(ruta_archivos,"%s\n",ruta);
	
}

/*
 * Devuelve la cantidad de documentos parseados.
 */
int integracion_parser_dir_explorer(char* indice_archivos){
	
	FILE* ruta_archivos = fopen(indice_archivos,"w");
	
	int cant =0;
	
	// Eleccion entre coleccion grande y pequena:
	vector_t* vector_sin_filtrar = dir_obtener_archivos("./archivos_cortos/",&cant);
	//vector_t* vector_sin_filtrar = dir_obtener_archivos("./archivos/",&cant);
	
	filtro_archivos_t* filtro = filtro_archivos_crear();
	filtro_archivos_agregar_extension(filtro,"txt");
	vector_t* vector = filtro_archivos_filtrar(filtro,vector_sin_filtrar,&cant);
	
	// ¿No anda el destruir con free de parametro??????????
	// Deberia andar. // TOMI: No anda porque el vector-destruir no conoce exactamente la cantidad de elementos que contiene, entonces hace invalid frees 
	int ID = 0;
	int tamanio_n_gramas = 3;
	for(int i = 0;i<cant;i++){
		
		// Siguiente archivo a parsear
		char* archivo = (char*)vector_obtener(vector, i);
		if (!archivo) continue;
		
		// Parseo el archivo
		printf("Parseando: %s\n",archivo);
		ID = parsear_archivo(archivo,1024*1024, ID, tamanio_n_gramas);
		
		// Lo escribo en el indice
		ruta_a_archivo(ruta_archivos,archivo);
		
	}
	
	fclose(ruta_archivos);
	filtro_archivos_destruir(filtro);
	vector_destruir_con_elementos(vector,free,cant);
	return cant;
	
}

int main(){
	
	// Valores y estructuras utilizadas:
	buffer_t* buffer_merge;
	unsigned long filas;
	unsigned long columnas;
	unsigned long elementos_distintos_de_0;
	
	// Nombre de los archivos destino:
	char* file_index = "file-id";
	char* merge_file = "output-merged";
	char* matrix_file = "output-matrix";
	
	// Parsing:
	columnas = integracion_parser_dir_explorer(file_index);
	
	// Merge:
	buffer_merge = merge_dos_fases(merge_file,columnas);
	filas = buffer_obtener_procesados(buffer_merge);
	elementos_distintos_de_0 = buffer_obtener_distintos_de_cero(buffer_merge);
	buffer_destruir(buffer_merge);
	
	// Construccion matriz:
	construir_matriz_post_merge(merge_file,matrix_file,filas,columnas,elementos_distintos_de_0);
	
	return 0;
	
}
